#include<bits/stdc++.h>
#define fi first
#define se second
namespace IO{
    template<typename T>
    void read(T &x){
        char ch=getchar();int fl=1;x=0;
        while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getchar();}
        while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getchar();}
        x*=fl;
    }
    template<typename T,typename ...Args>
    void read(T &x,Args& ...args){
        read(x);read(args...);
    }
    template <typename _Tp>
    void write(_Tp x) {
        if(x<0) x=(~x+1),putchar('-');
        if(x>9) write(x/10);
        putchar(x%10+'0');
    }
}
using namespace std;
using namespace IO;
const int N=500+5,mod=998244353;
int n,m;
double f[2][N][N],Min=1e9;
struct Node {int x,y;}A[N];
int cmp(Node x,Node y) {
    if(x.y==y.y) return x.x>y.x;
    return x.y<y.y;
}
double check(int len) {
    if(len<0) return 1e9;
    f[0][0][0]=0;
    for(int i=1;i<=n;i++) {
        int x=A[i].x,y=A[i].y;
        for(int j=0;j<=i;j++) {
            for(int k=0;k<=i;k++){
                f[i&1][j][k]=1e9;
            }
        }
        for(int k=0;k<i;k++) {//票数
            for(int j=k;j<i;j++) {//人数
                double X=1.0*x/(len+1)+f[!(i&1)][j][k];
                double Y=1.0*y/(1.0*k+1.0)+f[!(i&1)][j][k];
                f[i&1][j][k]=min(f[i&1][j][k],f[!(i&1)][j][k]);
                f[i&1][j+1][k]=min(f[i&1][j+1][k],X);
                if(y<1e9) f[i&1][j+1][k+1]=min(f[i&1][j+1][k+1],Y);
            }
        }
    }
    Min=min(Min,f[n&1][m][len]);
    return f[n&1][m][len];
}
signed main() {
#ifndef KAxdd
#ifndef ONLINE_JUDGE
    freopen("talk.in","r",stdin);
    freopen("talk.out","w",stdout);
#endif
#endif
    read(n,m); int tot=0;
    for(int i=1;i<=n;i++) {
        read(A[i].x,A[i].y);
        if(A[i].y==-1) A[i].y=1e9,tot++;
    }
    sort(A+1,A+n+1,cmp);
    int l=1,r=min(m,n-tot);
    while (r-l>1) {
        int mid = (l + r) / 2;
        int lmid = mid - 1;
        int rmid = mid + 1;
        if(check(lmid)<check(rmid)) r=mid;
        else l=mid;
    }
    Min=min({Min,check(l+1),check(l),check(l-1)});
    printf("%.10lf\n",Min);
    return 0;
}
/*
t1肯定是先获得帮手，然后在继续弄，
那么前缀的肯定是按照时间排序，毕竟帮手越多越快。
但是对于一个点来说，我们是否可以选择一个大一点的，然后其票数比较少的方案呢？
这显然是可以的。
那么问题就是枚举其帮手的个数，时间复杂度变为n^4然后不会了。 
问题出在我们没法快速排序其的大小，导致问题。
是个凹函数，貌似可以三分
*/